package com.sikaryofficial.backend.config;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.sikaryofficial.backend.constant.TenantConstant;
import com.sikaryofficial.backend.holder.TenantFilterContextHolder;
import com.sikaryofficial.common.security.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.apache.commons.collections4.MapUtils;

import java.util.Set;


/**
 * @author 33
 * 功能：自定义多租户处理器
 * 时间：2023/11/30 19:55
 */
@Slf4j
public class TenantHandler implements TenantLineHandler {

    private final TenantFilterProperties tenantFilterProperties;

    public TenantHandler(TenantFilterProperties tenantFilterProperties) {
        this.tenantFilterProperties = tenantFilterProperties;
    }

    /**
     * 当前租户的ID信息
     *
     * @return 当前租户的ID信息
     */
    @Override
    public Expression getTenantId() {
        String tenantStr =  tenantFilterProperties.getTenantStrByBrand(SecurityUtils.getBrand());
        return new LongValue(tenantStr);
    }

    /**
     * 用户设置租户判断租户的字段
     *
     * @return 字段信息
     */
    @Override
    public String getTenantIdColumn() {
        return tenantFilterProperties.getColumn();
    }

    /**
     * @param tableName 当前执行的SQL的表名
     * @return `true` 为不进行多租户过滤  `false` 为进行多租户过滤
     */
    @Override
    public boolean ignoreTable(String tableName) {
        // 自定义注解判断优先级最高 flag的值为 `true` 表示进行多租户过滤
        Boolean flag = MapUtils.getBoolean(TenantFilterContextHolder.getLocalMap(),TenantConstant.TENANT_OPEN_SWITCH);
        boolean isTenantFilterEnabled = Boolean.TRUE.equals(flag);
        if (isTenantFilterEnabled) {
           return true;
        }
        // 通过配置文件 配置需要进行租户白名单过滤的表
        Set<String> filterTables = tenantFilterProperties.getFilterTables();
        if (!CollUtil.isEmpty(filterTables)) {
            return filterTables.contains(tableName);
        }
        return true;
    }

}
